Български

Разгледайте тънкостите на ERC-721 смарт договорите за NFT. Научете за тяхната архитектура, имплементация, съображения за сигурност и приложения в реалния свят.

NFT смарт договори: Задълбочен поглед върху имплементацията на ERC-721

Незаменимите токени (NFT) направиха революция в света на дигиталните активи, като дадоха възможност за представяне на уникални предмети в блокчейн. В основата на повечето NFT стои стандартът ERC-721 – набор от правила, които уреждат как тези токени се създават, управляват и прехвърлят. Това изчерпателно ръководство предоставя задълбочен поглед върху ERC-721 смарт договорите, като обхваща тяхната архитектура, детайли по имплементацията, съображения за сигурност и практически приложения.

Какво е ERC-721?

ERC-721 е стандарт за представяне на незаменими токени в блокчейна на Ethereum. За разлика от ERC-20 токените, които са заменими (което означава, че всеки токен е идентичен с всеки друг), ERC-721 токените са уникални. Всеки токен има отделен идентификатор (ID), което го прави подходящ за представяне на собственост върху уникални дигитални или физически активи.

Основни характеристики на ERC-721 токените:

Архитектура на ERC-721 смарт договор

ERC-721 смарт договорът е програма на Solidity, която имплементира стандарта ERC-721. Обикновено той включва следните компоненти:

Основни функции:

Разширение за метаданни (опционално):

Разширение за изброяване (опционално):

Имплементиране на ERC-721 смарт договор с OpenZeppelin

OpenZeppelin предоставя сигурна и одитирана библиотека от смарт договори, която улеснява разработката на ERC-721 токени. Използването на имплементацията ERC721 от OpenZeppelin намалява риска от въвеждане на уязвимости във вашия код. Ето пример как да имплементирате ERC-721 смарт договор с помощта на OpenZeppelin:

Предварителни изисквания:

Стъпки:

  1. Инициализирайте проект с Truffle или Hardhat:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init

# Hardhat
mkdir my-nft-project
cd my-nft-project
npx hardhat
  1. Инсталирайте договорите на OpenZeppelin:
npm install @openzeppelin/contracts
  1. Създайте ERC-721 смарт договор: Създайте нов Solidity файл (напр. `MyNFT.sol`) във вашата директория `contracts`.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string private _baseURI;

    constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
        _baseURI = baseURI;
    }

    function mintNFT(address recipient) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));

        return newItemId;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        return string(abi.encodePacked(_tokenURI));
    }

    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory baseURI) public {
        _baseURI = baseURI;
    }



    // Следните функции са задължителни за презаписване (overrides) от Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

import "@openzeppelin/contracts/utils/Strings.sol";
  1. Компилирайте смарт договора: Използвайте Truffle или Hardhat, за да компилирате вашия смарт договор.
# Truffle
truffle compile

# Hardhat
npx hardhat compile
  1. Създайте скрипт за внедряване: Създайте нов JavaScript файл (напр. `deploy.js`) във вашата директория `migrations` или `scripts`.
// Пример за миграция с Truffle
const MyNFT = artifacts.require("MyNFT");

module.exports = async function (deployer) {
  await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};

// Пример за скрипт за внедряване с Hardhat
async function main() {
  const MyNFT = await ethers.getContractFactory("MyNFT");
  const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");

  await myNFT.deployed();

  console.log("MyNFT deployed to:", myNFT.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. Внедрете смарт договора: Внедрете вашия смарт договор в локален блокчейн (напр. Ganache) или в тестова мрежа (напр. Ropsten, Rinkeby).
# Truffle
truffle migrate

# Hardhat
npx hardhat run scripts/deploy.js --network localhost

Не забравяйте да замените `ipfs://YOUR_IPFS_CID/` с вашия действителен IPFS CID (Content Identifier). Този базов URI сочи към местоположението, където ще се съхраняват вашите NFT JSON файлове с метаданни.

Съхраняване на NFT метаданни в IPFS

Метаданните на NFT обикновено се съхраняват извън веригата (off-chain), за да се намалят разходите за съхранение на данни в блокчейна. IPFS (InterPlanetary File System) е децентрализирана мрежа за съхранение, която често се използва за съхраняване на NFT метаданни. Всеки NFT има `tokenURI`, който сочи към JSON файл в IPFS, съдържащ метаданни за NFT, като име, описание, URL на изображение и други атрибути.

Примерни NFT метаданни (JSON):

{
  "name": "Моят страхотен NFT",
  "description": "Това е уникален NFT.",
  "image": "ipfs://YOUR_IPFS_CID/image.png",
  "attributes": [
    {
      "trait_type": "Фон",
      "value": "Син"
    },
    {
      "trait_type": "Персонаж",
      "value": "Робот"
    }
  ]
}

Заменете `ipfs://YOUR_IPFS_CID/image.png` с действителния IPFS CID на вашето изображение.

Стъпки за качване на метаданни в IPFS:

  1. Изберете IPFS клиент: Изберете IPFS клиент като IPFS Desktop, Pinata или NFT.Storage.
  2. Качете вашите метаданни: Качете вашите NFT JSON файлове с метаданни и изображения в IPFS, използвайки избрания от вас клиент.
  3. Получете IPFS CID: След като качите метаданните си, ще получите IPFS CID. Това е уникален идентификатор за вашите данни в IPFS.
  4. Актуализирайте смарт договора: Актуализирайте функцията `tokenURI` във вашия смарт договор, така че да сочи към вашия IPFS CID.

Съображения за сигурност при ERC-721 смарт договори

Сигурността е от първостепенно значение при разработването на ERC-721 смарт договори. Ето някои критични съображения за сигурност:

Приложения на ERC-721 NFT в реалния свят

ERC-721 NFT се използват в широк спектър от приложения, включително:

Международни примери:

Напреднали концепции в ERC-721

ERC-721A

ERC-721A е по-ефективна по отношение на газ (gas) имплементация на стандарта ERC-721, която оптимизира „сеченето“ (minting) на множество NFT в една трансакция. Тя намалява разходите за газ, като амортизира разходите за съхранение върху няколко токена. Това може да бъде от полза за проекти, които включват „сечене“ на голям брой NFT.

Lazy Minting (Мързеливо сечене)

Lazy minting е техника, при която NFT се „секат“ едва когато бъдат закупени. Това може да спести разходи за газ за проекти, които имат голям брой NFT, но не очакват всички да бъдат продадени. Метаданните на NFT се съхраняват извън веригата, докато NFT не бъде закупен, в който момент токенът се „сече“ и метаданните се добавят към блокчейна.

Soulbound Tokens (Свързани с душата токени)

Soulbound токените са NFT, които са постоянно свързани с конкретен адрес и не могат да бъдат прехвърляни. Тези токени могат да се използват за представяне на непрехвърляеми удостоверения, като образователни дипломи, професионални сертификати или членство в общност. Това се постига чрез премахване или ограничаване на функцията `transferFrom`.

Бъдещето на ERC-721 и NFT

Стандартът ERC-721 продължава да се развива, като текущите изследвания и разработки са насочени към подобряване на неговата ефективност, сигурност и функционалност. Бъдещите разработки може да включват:

Заключение

ERC-721 смарт договорите са мощен инструмент за представяне на собствеността върху уникални дигитални и физически активи в блокчейн. Разбирайки архитектурата, детайлите по имплементацията, съображенията за сигурност и практическите приложения на ERC-721, разработчиците могат да създават иновативни и въздействащи NFT проекти. С продължаващия растеж и еволюция на NFT екосистемата, стандартът ERC-721 ще играе решаваща роля в оформянето на бъдещето на дигиталната собственост.

Това ръководство предоставя солидна основа за разбиране и имплементиране на ERC-721 смарт договори. Не забравяйте винаги да давате приоритет на сигурността и да следвате най-добрите практики, когато разработвате и внедрявате собствени NFT проекти. Успех!

NFT смарт договори: Задълбочен поглед върху имплементацията на ERC-721 | MLOG